use common::error::SysError;
use common::model::ProjectDirInfo;
use std::fs;
use std::path::Path;

pub fn copy_module_to_project(
    module_dir_info: &ProjectDirInfo,
    project_dir_info: &ProjectDirInfo,
) -> Result<(), Box<dyn std::error::Error>> {
    // 获取当前目录

    if !module_dir_info.src_path().exists() || !module_dir_info.src_path().is_dir() {
        return Err(SysError::msg(&format!(
            "开发环境下的src目录不存在:{:?}",
            module_dir_info.src_path()
        ))
        .into());
    }

    if !project_dir_info.src_path().exists() || !project_dir_info.src_path().is_dir() {
        return Err(SysError::msg(&format!(
            "调试环境下的src目录不存在:{:?}",
            project_dir_info.src_path()
        ))
        .into());
    }

    // 复制src目录中的所有内容到目标目录
    for entry in fs::read_dir(module_dir_info.src_path())? {
        let entry = entry?;
        let path = entry.path();
        let file_name = path
            .file_name()
            .ok_or_else(|| SysError::msg("copy_src_to_project文件名获取错误"))?;
        let target_path = project_dir_info.src_path().join(file_name);

        if path.is_dir() {
            fs::create_dir_all(&target_path)?;
            copy_dir_contents(&path, &target_path)?;
        } else if path.is_file() {
            fs::copy(&path, &target_path)?;
        }
    }

    Ok(())
}

fn copy_dir_contents(src: &Path, dst: &Path) -> Result<(), Box<dyn std::error::Error>> {
    for entry in fs::read_dir(src)? {
        let entry = entry?;
        let path = entry.path();
        let file_name = path
            .file_name()
            .ok_or_else(|| SysError::msg("copy_src_to_project文件名获取错误"))?;
        let target_path = dst.join(file_name);

        if path.is_dir() {
            fs::create_dir_all(&target_path)?;
            copy_dir_contents(&path, &target_path)?;
        } else if path.is_file() {
            fs::copy(&path, &target_path)?;
        }
    }
    Ok(())
}
